#include<iostream>
#include<vector>
#include<assert.h>
using namespace std;

#include "vector.h"

void test_vector()
{
	vector<int> v;
	v.reserve(10);   //注意这里的reserve只是开辟了空间，不能使用[]进行访问，会越界报错
	v.resize(8, 1);  //注意resize，当之前的空间不够的时候，会进行扩容，当<size()时，
	for (auto ve : v)  //不会进行缩容，只是改变size的大小
	{                  //因为delete[]不能释放开辟空间的部分内存，这种情况必须得异地扩容
		cout << ve << " "; //再把之前的内容复制过去，然后在释放前面的空间
	}
	v[0] = 1;        //像这种情况可以使用resize进行大小的调整，在访问
	cout << endl << v.size() << " " << v.capacity() << endl;


	//begin和end一样  rbegin 和rend是倒着访问，记得rbegin是reverse_iterator
	vector<int>::iterator start = v.begin();  //有两种迭代器，一种是const的一种是非const的
	while (start < v.end())
	{
		(*start)++;
		start++;
	}
	for (auto ve : v)
	{
		cout << ve << " ";
	}

	//empty()是判断vector是否为空
	if (v.empty())
	{
		cout << endl << "empty" << endl;
	}

	//shrink_to_fit  这是缩容，不建议使用，因为缩容代价太大，异地开空间，并复制
	v.shrink_to_fit();
	cout << endl << v.size() << " " << v.capacity() << endl;

	//at的访问更类似于一个函数
	for (size_t i = 0; i < v.size(); ++i)
	{
		cout << v.at(i) << " ";
	}
}
void test_vector1()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(90);   //这儿扩容也是按1.5倍数走的
	v1.push_back(5);
	v1.push_back(8);
	//返回前一个
	cout << v1.front() << endl;
	cout << v1.back()  << endl;

	//pop_back
	 v1.pop_back(); //删除数据
	 cout << v1.back() << endl;

	 //insert 函数可以配合find 函数一块儿使用
	 vector<int>::iterator it = v1.begin();
	 it = std::find(v1.begin(), v1.end()-1, 90);
	 cout << it-v1.begin() << endl;
	 int len = it - v1.begin();
	 //在90前面插入 1000
	 v1.insert(v1.begin()+len, 1000);
	 for (auto ve : v1)
	 {
		 cout << ve << " ";
	 }
	 cout << endl;
	 v1.erase(v1.begin() + len,v1.end());
	 for (auto ve : v1)
	 {
		 cout << ve << " ";
	 }
	 cout << endl;
	 //swap函数
	 vector<int> v2;
	 v2.push_back(10);
	 v2.push_back(20);
	 v2.push_back(30);
	 v2.push_back(900);   
	 v2.push_back(50); 
	 //v1.swap(v2); 
	 std::swap(v1, v2);   //跟上面是一样的，一个是调用algorithm库,一个是vector自身的
	 for (auto ve : v1) 
	 {
		 cout << ve << " ";
	 }
	 cout << endl;

	 //clear()清除数据
	 v1.clear();
	 cout << v1.size() << endl;
}

void test_vector2()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.resize(2, 1);
	for (auto ve : v1)
	{
		cout << ve << " ";
	}
	cout << endl;
}

int main()
{
	//test_vector2();
	my_vector::vector_test();
	return 0;
}


